/********************************************************************************
 * Project Name		[JavaSE_Fundamentals]
 * File Name     	[ThreadCreation.java]
 * Creation Date 	[2015-01-01]
 * 
 * Copyright© ge.y.yang@gmail.com All Rights Reserved
 * 
 * Work hard, play harder, think big and keep fit
 ********************************************************************************/
package thread;

/**
 * 创建线程
 * 
 * 方式一 :<br/>
 * 1. 自定义一个类继承Thread类<br/>
 * 2. 重写Thread类的run方法, 把自定义线程的任务代码写在run方法里<br/>
 * 3. 创建Thread的子类对象并调用start方法启动一个线程<br/>
 * 注意: 不要直接调用run方法, 直接调用 run方法相当于调用了一个普通的方法而已<br/>
 * 
 * 方式二:<br/>
 * 1. 自定义一个类实现Runnable接口<br/>
 * 2. 实现Runnable接口的run方法, 把自定义线程的任务定义在run方法里<br/>
 * 3. 创建Runnable实现类对象<br/>
 * 4. 创建Thread类的对象,并且把Runnable实现类的对象作为参数传递<br/>
 * 5. 调用Thread对象的start方法开启一个线程<br/>
 * 
 * 
 * Q: 请问Runnable实现类的对象是线程对象吗?<br/>
 * A: Runnable实现类的对象并不是一个线程对象, 只不过是实现了Runnable接口的对象而已,
 * 只有是Thread类或者是Thread类的子类才是线程对象<br/>
 * 
 * Q: 为什么要把Runnable实现类的对象作为实参传递给Thread对象呢? 作用是什么?<br/>
 * A: 作用就是把Runnable实现类的对象的run方法作为了线程的任务代码去执行了<br/>
 * 
 * 推荐使用 实现Runnable接口的方式创建线程, 因为java单继承, 多实现的<br/>
 * 
 * @author 不落的太阳(Sean Yang aka ShortPeace)
 * @version 1.0
 * @since jdk 1.8
 * 
 */
public class ThreadCreation {

	@SuppressWarnings("unused")
	private void dataShare() {
		Runnable r1 = new MyThread02();
		Runnable r2 = new MyThread02();

		// t1和t2共享代码和数据
		Thread t1 = new Thread(r1);
		Thread t2 = new Thread(r1);

		// t2和t3共享代码, 但不共享数据
		Thread t3 = new Thread(r2);

		// t4与其他线程既不共享代码, 也不共享数据
		Thread t4 = new MyThread01();

	}

	public static void main(String[] args) {
		Thread t01 = new MyThread01();
		t01.setName("第一个线程");
		t01.start();

		Runnable r = new MyThread02();
		Thread t02 = new Thread(r);
		t02.start();
	}
}

/**
 * 实现方式1 - 继承Thread类
 * 
 * @author 不落的太阳(Sean Yang aka ShortPeace)
 * @version 1.0
 * @since jdk 1.8
 *
 */
class MyThread01 extends Thread {

	public MyThread01() {
		super();
	}

	public MyThread01(String name) {
		super(name);
	}

	@Override
	public void run() {
		System.out.println("Thread run with name ---> " + this.getName());
	}
}

/**
 * 实现方式2 - 实现Runnable接口
 * 
 * @author 不落的太阳(Sean Yang aka ShortPeace)
 * @version 1.0
 * @since jdk 1.8
 *
 */
class MyThread02 implements Runnable {

	@Override
	public void run() {
		System.out.println("Thread run with name ---> 第二个线程");
	}
}